
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>


//
//
//一个数组中只有两个数字是出现一次，其他所有数字都出现了两次。
//
//编写一个函数找出这两个只出现一次的数字。
//
//例如：
//
//有数组的元素是：1，2，3，4，5，1，2，3，4，6
//
//只有5和6只出现1次，要找出5和6

//void findTwoNum(int arr[], int n, int* pdog1, int* pdog2) {
//	//先把所有数都^ 就能得到两个不同的数^的结果
//	int ret = 0;
//	for (int i = 0; i < n; ++i) {
//		ret ^= arr[i];
//	}
//	//此时得到5^6的结果
//	//然后找到5^6结果的第几位为1
//	int pos = 0;
//	for (int i = 0; i < 32; ++i) {
//		if (((ret >> i) & 1) == 1) {
//			pos = i;
//			break;
//		}
//	}
//	//此时把所有数据 通过pos位置是否为1 分为两组 ，这时两个不同的数就会被分在两个不同的组
//	//对这两组值分别^ 就能找出两个单身狗
//	for (int i = 0; i < n; ++i) {
//		if (((arr[i] >> pos) & 1) == 1) {
//			(*pdog1) ^= arr[i];
//		}
//	}
//	//此时 ret里是*pdog1 ^ *pdog2 的值
//	//那么要得到*pdog2的值，就需要再把ret和*podg1 的值再^一次
//	*pdog2 = ret ^ (*pdog1);
//}
//
//#include<assert.h>
//#include<stdlib.h>
//#include<ctype.h>
//
//
//enum State {
//	VALID,			//合法返回
//	INVALID			//非法返回
//}state = INVALID;	//默认非法返回
//
//int my_atoi(const char* str) {
//	//输入空指针
//	assert(str);
//	//输入""
//	if (*str == '\0') {
//		//此时没有设置返回状态，默认是非法返回
//		return 0;
//	}
//	//输入空格
//	while(isspace(*str)) {
//		str++;
//	}
//	//输入+-
//	int flag = 1;
//	if (*str == '-') {
//		flag = -1;
//		str++;
//	}
//	else if (*str == '+') {
//		str++;
//	}
//	//输入数据非法，包含除0-9以外的其他字符
//	long long ret = 0;
//	while (*str != '\0') {
//		//如果要计算字符是数字字符，就运算
//		if (isdigit(*str)) {
//			//直接用flag来决定加的数的正负
//			ret = ret * 10 + (flag)*(*str - '0');
//
//			if (ret < INT_MIN || ret > INT_MAX) {
//				return 0;
//			}
//		}
//		else {
//			//此时字符串遇到除数字外的其他字符，可以返回非法字符以前的数字
//			return (int)ret;
//		}
//		str++;
//	}
//	//这里的数都是合法返回
//	state = VALID;
//	return (int)ret;
//	//数据超出限制
//}
//
//struct s
//{
//	int a;
//	char b;
//	short c;
//};
//
//
//
//#define OFFSETOF(type, member)  (size_t)&(((type*)0)->member)
//
////交换一个数的奇数位和偶数位
//#define SWAP(n)  (n = ((n&0xaaaaaaaa)>>1) + ((n&0x55555555)<<1))
//
//int main() {
//	/*int arr[] = { 1,1,2,2,3,3,4,4,5,5,22,33};
//	int dog1 = 0;
//	int dog2 = 0;
//	int size = sizeof(arr) / sizeof(arr[0]);
//	findTwoNum(arr, size, &dog1, &dog2);
//		printf("%d %d\n", dog1, dog2);*/
//	//int ret = my_atoi("0");
//	//if (state == VALID) {
//	//	printf("%d\n", ret);
//	//}
//	//else {
//	//	printf("%d\n", ret);
//	//}
//
//	//printf("%u\n", OFFSETOF(struct s, a));
//	//printf("%u\n", OFFSETOF(struct s, b));
//	//printf("%u\n", OFFSETOF(struct s, c));
//	
//	int a = -120;
//	SWAP(a);
//	printf("%d\n", a);
//
//	return 0;
//}
//
//




//1
//1 1
//1 2 1
//1 3 3 1
//1 4 6 4 1

//void yanghuisanjiao(int n) {
//	//每一行的第一个数据都是1
//	int d[30] = { 1 };
//	//先打印第一行
//	printf("1\n");
//
//	for (int i = 1; i < n; ++i) {
//		//为了防止影响前面数据，从后往前打印
//		for (int j = i; j > 0; --j) {
//			d[j] += d[j - 1];
//		}
//		//一行算完直接打印
//		for (int j = 0; j <= i; j++) {
//			printf("%d ", d[j]);
//		}
//		printf("\n");
//	}
//}


//1
//1 1
//1 2 1
//1 3 3 1
//1 4 6 4 1
//void yanghuisanjiao(int n) {
//	int arr[30][30] = { 1 };
//	
//	for (int i = 0; i < n; ++i) {
//		for (int j = 0; j <= i; ++j) {
//			if (j == 0 || i == j) {
//				arr[i][j] = 1;
//			}
//			else {
//				arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
//			}
//		}
//	}
//
//	for (int i = 0; i < n; ++i) {
//		for (int j = 0; j <= i; ++j) {
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//}

//日本某地发生了一件谋杀案，警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
//以下为4个嫌疑犯的供词 :
//A说：不是我。
//B说：是C。
//C说：是D。
//D说：C在胡说
//已知3个人说了真话，1个人说的是假话。
//现在请根据这些信息，写一个程序来确定到底谁是凶手。

//void guessKiller() {
//	for (char killer = 'a'; killer <= 'd'; ++killer) {
//		if (((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd')) == 3) {
//			printf("%c ", killer);
//		}
//	}
//}


//5位运动员参加了10米台跳水比赛，有人让他们预测比赛结果：
//A选手说：B第二，我第三；
//B选手说：我第二，E第四；
//C选手说：我第一，D第二；
//D选手说：C最后，我第三；
//E选手说：我第四，A第一；
//比赛结束后，每位选手都说对了一半，请编程确定比赛的名次。

//void GuessN() {
//	for (int a = 0; a <= 5; ++a) {
//		for (int b = 0; b <= 5; ++b) {
//			for (int c = 0; c <= 5; ++c) {
//				for (int d = 0; d <= 5; ++d) {
//					for (int e = 0; e <= 5; ++e) {
//						if ((b == 2) + (a == 3) == 1 &&
//							(b == 2) + (e == 4) == 1 &&
//							(c == 1) + (d == 2) == 1 &&
//							(c == 5) + (d == 3) == 1 &&
//							(e == 4) + (a == 1) == 1 &&
//							(a * b * c * d * e) == 120) {
//							printf("a = %d , b = %d , c = %d, d = %d, e = %d \n", a, b, c, d, e);
//						}
//					}
//				}
//			}
//		}
//	}
//}

//有一个数字矩阵，矩阵的每行从左到右是递增的，矩阵从上到下是递增的，请编写程序在这样的矩阵中查找某个数字是否存在。
//要求：时间复杂度小于O(N);
	// 1 2 3
	// 4 5 6
	// 7 8 9
// *px 是矩阵的行数  *py是矩阵的列数
//void yangshijz(int arr[][3], int* px, int* py, int key) {
//	
//	int x = 0;
//	int y = *py - 1;
//
//	while (x < *px && y >= 0) {
//		if (arr[x][y] > key) {
//			y--;
//		}
//		else if (arr[x][y] < key) {
//			x++;
//		}
//		else {
//			*px = x;
//			*py = y;
//			return;
//		}
//	}
//
//	*px = -1;
//	*py = -1;
//}

//int main() {
//	//yanghuisanjiao(5);
//	//GuessN();
//
//	int arr[][3] = { 1,2,3,4,5,6,7,8,9 };
//	int key = 0;
//	scanf_s("%d", &key);
//	int x = 3;
//	int y = 3;
//	yangshijz(arr, &x, &y, key);
//
//	if (x == -1 && y == -1) {
//		printf("没找到");
//	}
//	else {
//		printf("找到了，下标是arr[%d][%d]", x, y);
//	}
//	return 0;
//}

//实现一个函数，可以左旋字符串中的k个字符。
//例如：
//ABCD左旋一个字符得到BCDA
//ABCD左旋两个字符得到CDAB

void leftRound(char* str, int k) {
	int len = strlen(str);
	k %= len;
	while (k--) {
		char tmp = *str;
		for (int i = 0; i < len - 1; ++i) {
			*(str + i) = *(str + i + 1);
		}
		*(str + len - 1) = tmp;
	}
}

//#include<assert.h>
//
//void reverse(char* left, char* right) {
//	assert(left && right);
//	while (left < right) {
//		char tmp = *left;
//		*left = *right;
//		*right = tmp;
//
//		left++;
//		right--;
//	}
//}
//
//void leftRound(char* str, int k) {
//	int len = strlen(str);
//	k %= len;
//	//先逆置k个字符，再逆置后面字符 ，再整体逆置
//	reverse(str, str + k - 1);
//	reverse(str + k, str + len - 1);
//	reverse(str, str + len - 1);
//}



//写一个函数，判断一个字符串是否为另外一个字符串旋转之后的字符串。
//例如：给定s1 = AABCD和s2 = BCDAA，返回1
//给定s1 = abcd和s2 = ACBD，返回0
//AABCD左旋一个字符得到ABCDA
//AABCD左旋两个字符得到BCDAA
//AABCD右旋一个字符得到DAABC

int findRound(const char* str1, char* str2) {
	int len = strlen(str2);
	int j = len;

	while (j--) {
		char tmp = *str2;
		for (int i = 0; i < len - 1; ++i) {
			*(str2 + i) = *(str2 + i + 1);
		}
		*(str2 + len - 1) = tmp;

		if (my_strcmp(str1, str2) == 0) {
			return 1;
		}
	}

	return 0;
}


//int findRound(const char* str1, char* str2) {
//	int len1 = strlen(str1);
//	int len2 = strlen(str2);
//
//	char tmp[100] = "";
//	strcpy(tmp, str1);
//	strcat(tmp, str1);
//
//	if (strstr(tmp, str2) == NULL) {
//		return 0;
//	}
//	else {
//		return 1;
//	}
//}

void* my_memcpy(void* dst, const void* src, size_t num) {
	void* tmp = dst;

	while (num--) {
		*(char*)dst = *(char*)src;
		((char*)dst)++;
		((char*)src)++;
	}

	return dst;
}


int my_strcmp(const char* src, const char* dst){
	assert(src && dst);

	while ((*src == *dst) && *dst) {
		src++;
		dst++;
	}

	return *(unsigned char*)src - *(unsigned char*)dst;
}


int main() {
	/*char str[] = "abcdef";
	printf("%s\n", str);
	leftRound(str, 1);
	printf("%s\n", str);*/

	char str1[] = "abcdef";
	char str2[] = "defabc";
	int ret = findRound(str1, str2);
	if (ret == 1) {
		printf("YES\n");
	}
	else {
		printf("NO\n");
	}

	return 0;
}